package com.xm;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;

@Slf4j
@Service
public class CacheService {


    /**
     * 简单使用
     *
     * @param
     * @return
     * @date 2024/10/10 10:57
     * @author lililiang
     */
    @Cacheable(
            value = "userList" // 指定缓存名称
    )
    public List<String> getUserList(){
        log.info("从数据库中查询数据");
        return Arrays.asList("张三","李四","王五");
    }


    /**
     * 指定键名
     *
     * @param
     * @return
     * @date 2024/10/10 10:57
     * @author lililiang
     */
    @Cacheable(
            value = "userList",  // 指定缓存名称
            key = "#id"          // 指定缓存键名
    )
    public List<String> getUserListById(String id){
        log.info("从数据库中查询数据");
        return Arrays.asList("张三","李四","王五");
    }

    /**
     * 指定键名-使用对象参数
     *
     * @param
     * @return
     * @date 2024/10/10 10:57
     * @author lililiang
     */
    @Cacheable(
            value = "userList", // 指定缓存名称
            key = "#user.id"    // 指定缓存键名，使用对象参数
    )
    public List<String> getUserListByUser(User user){
        log.info("从数据库中查询数据");
        return Arrays.asList("张三","李四","王五");
    }

    /**
     * 缓存条件-参数条件
     *
     * @param
     * @return
     * @date 2024/10/10 10:57
     * @author lililiang
     */
    @Cacheable(
            value = "userList", // 指定缓存名称
            key = "#user.id",   // 指定缓存键名，使用对象参数
            condition = "#user.id != '4'" // id不等于4时缓存结果
    )
    public List<String> getUserListCondition(User user){
        log.info("从数据库中查询数据，当前id:{}", user.getId());
        return Arrays.asList("张三","李四","王五");
    }

    /**
     * 缓存条件-结果条件
     *
     * @param
     * @return
     * @date 2024/10/10 10:57
     * @author lililiang
     */
    @Cacheable(
            value = "userList", // 指定缓存名称
            key = "#user.id",   // 指定缓存键名，使用对象参数
            unless = "#result == null" // 返回值不是null时才缓存
    )
    public List<String> getUserListUnless(User user){
        log.info("从数据库中查询数据，当前id:{}", user.getId());
        if("6".equals(user.getId())){
            return null;
        }
        return Arrays.asList("张三","李四","王五");
    }

    /**
     * 同步处理
     *
     * @param
     * @return
     * @date 2024/10/10 10:57
     * @author lililiang
     */
    @Cacheable(
            value = "userList", // 指定缓存名称
            key = "#user.id",   // 指定缓存键名，使用对象参数
            sync = true         // 多个请求并发时，只有一个请求进入，其他请求等待获取缓存结果
    )
    public List<String> getUserListSync(User user){
        log.info("从数据库中查询数据，当前id:{}", user.getId());
        if("6".equals(user.getId())){
            return null;
        }
        return Arrays.asList("张三","李四","王五");
    }


    /**
     * 保存数据同事更新数据
     *
     * @param
     * @return
     * @date 2024/10/10 10:57
     * @author lililiang
     */
    @CachePut(
            value = "userList", // 指定缓存名称
            key = "#user.id",   // 指定缓存键名，使用对象参数
            condition = "#user.id != '4'", // id不等于4时缓存结果
            unless = "#result == null" // 返回值不是null时才缓存
    )
    public List<String> updateUser(User user) {
        return Arrays.asList(user.getName());
    }

    /**
     * 保存数据同事更新数据
     *
     * @param
     * @return
     * @date 2024/10/10 10:57
     * @author lililiang
     */
    @CacheEvict(
            value = "userList", // 指定缓存名称
            key = "#user.id",   // 指定缓存键名，使用对象参数
            condition = "#user.id != '4'" // id不等于4时缓存结果
    )
    public List<String> deleteUser(User user) {
        return Arrays.asList(user.getName());
    }

}
